#include "LCD12864.h"
/***********************************************************************
  * @代码说明：本代码内容用于使用LCD12864
  * @作者：Astilbe
  * @日期：2020/09/10
  * @开发指导：wiki.stduino.com

  ***********************************************************************/
void Lcd12864::initial(int CLOCK,int DATA,int LATCH,int PSB)
{
 delay(40);
 clockPin=CLOCK;
 dataPin=DATA;
 latchPin=LATCH;
 psbPin =PSB;
    
 Serial.begin(9600);
    
 pinMode(clockPin,OUTPUT);
 pinMode(dataPin,OUTPUT);
 pinMode(latchPin,OUTPUT);
 pinMode(psbPin,OUTPUT);
    
 pinMode(psbPin,LOW);
 digitalWrite(latchPin, LOW);
 


WriteCommand(0x30);       //功能设定控制字
WriteCommand(0x02);       
WriteCommand(0x06);       //进入设定点控制字
WriteCommand(0x0c);       //显示开关控制字
WriteCommand(0x01);       //清楚屏幕控制字
WriteCommand(0x80);       //选择起始地址
}

 void Lcd12864::WriteByte(int dat)//�����ֽ�
{
    digitalWrite(latchPin,HIGH);//ѡ������
    delayMicroseconds(80);
    shiftOut(dataPin, clockPin, MSBFIRST, dat);
    digitalWrite(latchPin, LOW);
    
}

void Lcd12864::WriteCommand(int CMD)
{
   int H_data,L_data;
   H_data = CMD;
   H_data &= 0xf0;           //屏蔽低四位的数据
   L_data = CMD;             //xxxx0000格式
   L_data &= 0x0f;           //屏蔽高4位的数据
   L_data <<= 4;             //xxxx0000格式
    
   WriteByte(0xf8);          //RS=0，选择写入指令
   WriteByte(H_data);
   WriteByte(L_data);
    
   delayMicroseconds(10);
   //digitalWrite(latchPin,LOW);//ȡ��ѡ������
}

void Lcd12864::WriteData(int CMD)
{
   int H_data,L_data;
   H_data = CMD;
   H_data &= 0xf0;           //屏蔽低4位的数据
   L_data = CMD;             //xxxx0000格式
   L_data &= 0x0f;           //屏蔽高4位的数据
   L_data <<= 4;             //xxxx0000格式
    
   WriteByte(0xfa);          //RS=1，选择写入数据
   WriteByte(H_data);
   WriteByte(L_data);
   delayMicroseconds(10);
   //digitalWrite(latchPin,LOW);//��λ��Ч
}

void Lcd12864::clean(void)
{  
    WriteCommand(0x30);
    WriteCommand(0x01); //清除显示
    delay(20);
}

void Lcd12864::DisplayString(int X,int Y,String ptr)
{
  //delay(1);
  int i;
  int dat =ptr.length();

  switch(X)
   {
     case 0:  Y|=0x80;break;

     case 1:  Y|=0x90;break;

     case 2:  Y|=0x88;break;

     case 3:  Y|=0x98;break;

     default: break;
   }
   
  WriteCommand(Y);       // 定位显示起始地址

  for(i=0;i<dat;i++)
    { 
      WriteData(ptr[i]);  //显示汉字时注意码值，连续两个码表示一个汉字
    }
}

void Lcd12864::DisplaySig(int M,int N,int sig)
{
  switch(M)
   {
     case 0:  N|=0x80;break;

     case 1:  N|=0x90;break;

     case 2:  N|=0x88;break;

     case 3:  N|=0x98;break;

     default: break;
   }
  WriteCommand(N); // 定位显示起始地址
  WriteData(sig); //输出单个字符
 }



    

